package com.easyadmin.pro.modules.sys.service.impl;

import com.easyadmin.pro.common.constants.StatusConstants;
import com.easyadmin.pro.common.enums.HttpCodeEnum;
import com.easyadmin.pro.common.exception.BusinessException;
import com.easyadmin.pro.modules.sys.entity.DictEntity;
import com.easyadmin.pro.modules.sys.query.DictItemQuery;
import com.easyadmin.pro.modules.sys.rest.DictItemResult;
import com.easyadmin.pro.modules.sys.service.IDictService;
import com.easyadmin.pro.modules.sys.vo.DictItemVo;
import com.easyadmin.pro.modules.sys.vo.TableItemSchemaInfoVo;
import com.easyadmin.pro.tool.DictGeneratorUtils;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.easyadmin.pro.modules.sys.entity.DictItemEntity;
import com.easyadmin.pro.modules.sys.mapper.DictItemMapper;
import com.easyadmin.pro.modules.sys.service.IDictItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

/**
 *  服务层实现。
 *
 * @author xulin
 * @since 2024-08-19
 */
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItemEntity> implements IDictItemService {

    private final IDictService dictService;

    private final DictGeneratorUtils dictGeneratorUtils;

    @Override
    public void saveDictItem(DictItemVo dictItemVo) {
        Long dictId = dictItemVo.getDictId();
        DictEntity dictEntity = dictService.getById(dictId);
        if (Objects.isNull(dictEntity)) {
            throw new BusinessException(HttpCodeEnum.SYSTEM_ERROR, "字典不存在");
        }
        dictItemVo.setDictCode(dictEntity.getDictCode());
        // 生成属性
        dictGeneratorUtils.generatorDictItem(dictItemVo);
        DictItemEntity dictItemEntity = new DictItemEntity();
        BeanUtils.copyProperties(dictItemVo, dictItemEntity);
        dictItemEntity.setDictId(dictItemVo.getDictId());
        dictItemEntity.setStatus(Integer.valueOf(StatusConstants.STATUS_1));
        mapper.insert(dictItemEntity);
    }

    @Override
    public void removeDictItem(Serializable id) {
        DictItemEntity dictItemEntity = mapper.selectOneById(id);
        Long dictId = dictItemEntity.getDictId();
        DictEntity dictEntity = dictService.getById(dictId);
        if (Objects.isNull(dictEntity)) {
            throw new BusinessException(HttpCodeEnum.SYSTEM_ERROR, "字典不存在");
        }
        dictGeneratorUtils.removeDictItem(dictItemEntity.getDictItemCode(), dictEntity.getDictCode());
        mapper.delete(dictItemEntity);
    }

    @Override
    public List<TableItemSchemaInfoVo> selectDictItemInformation(List<String> dictNames, String dataSourceName) {
        return mapper.selectDictItemInformation(dictNames, dataSourceName);
    }

    @Override
    public List<DictItemResult> queryPage(DictItemQuery dictItemQuery) {
        return mapper.queryPage(dictItemQuery);
    }

}
